﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace LWH.ByteProtocol
{
    /**
     * Created by thelwh on 2016/11/27.
    * 协议解析工厂类,包含对黏包的处理
    * AbstractProtocolFactory主要的工作是提供一个处理黏包的流程框架，并不会
    * 对dataQueue进行任何实质上的处理
    */
    public abstract class AbstractProtocolFactory<T> : IProtocolFactory<T>
    {
        protected bool isMatchHeader = false;


        virtual public void parseProtocol(T dataQueue, Action<AbstractProtocol> didParse)
        {
            bool isParseProtocol;


            do
            {

                isParseProtocol = false;

                if (!isMatchHeader)
                {
                    isMatchHeader = matchHeader(dataQueue);
                }


                if (isMatchHeader)
                {

                    AbstractProtocol protocol = getProtocol(dataQueue);

                    if (protocol != null)
                    {
                        isParseProtocol = true;
                        isMatchHeader = false;

                        didParse?.Invoke(protocol);

                    }
                }

            }
            while (isParseProtocol);//黏包处理
        }

        /**
         * 匹配帧头
         * @param dataQueue 源数据
         * @return 是否匹配
         */
        protected abstract bool matchHeader(T dataQueue);

        /**
         * 获取协议
         * @param dataQueue 源数据
         * @return 解析的协议
         */
        protected abstract AbstractProtocol getProtocol(T dataQueue);
    }
}
